package com.heima.apuser.service.impl;

import com.heima.model.apuser.dto.ApUserLoginDto;
import com.heima.model.apuser.entity.ApUser;
import com.heima.apuser.dao.ApUserDao;
import com.heima.apuser.service.ApUserService;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.utils.common.AppJwtUtil;
import org.springframework.stereotype.Service;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.HashMap;

/**
 * APP用户表(ApUser)表服务实现类
 *
 * @author makejava
 * @since 2022-04-18 19:30:45
 */
@Service("apUserService")
public class ApUserServiceImpl implements ApUserService {
    @Resource
    private ApUserDao apUserDao;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public ApUser queryById(Long id) {
        return this.apUserDao.queryById(id);
    }

    /**
     * 分页查询
     *
     * @param apUser      筛选条件
     * @param pageRequest 分页对象
     * @return 查询结果
     */
    @Override
    public Page<ApUser> queryByPage(ApUser apUser, PageRequest pageRequest) {
        long total = this.apUserDao.count(apUser);
        return new PageImpl<>(this.apUserDao.queryAllByLimit(apUser, pageRequest), pageRequest, total);
    }

    /**
     * 新增数据
     *
     * @param apUser 实例对象
     * @return 实例对象
     */
    @Override
    public ApUser insert(ApUser apUser) {
        this.apUserDao.insert(apUser);
        return apUser;
    }

    /**
     * 修改数据
     *
     * @param apUser 实例对象
     * @return 实例对象
     */
    @Override
    public ApUser update(ApUser apUser) {
        this.apUserDao.update(apUser);
        return this.queryById(apUser.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Long id) {
        return this.apUserDao.deleteById(id) > 0;
    }

    /**
     * 登录
     *
     * @param dto
     * @return
     */
    @Override
    public ResponseResult login(ApUserLoginDto dto) {
        //通过用户有没有传参判断是正常登录还是游客登录
        //1.游客登录
        if (StringUtils.isEmpty(dto.getPhone()) && StringUtils.isEmpty(dto.getPassword())) {
            //游客登录,设置令牌返回
            HashMap<String, String> map = new HashMap<>();
            String token = AppJwtUtil.getToken(0l);
            map.put("token", token);
            return ResponseResult.okResult(map);
        }
        //2.账号密码登录
        if (StringUtils.isEmpty(dto.getPhone())){
            return  ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE);
        }
        ApUser apUser=  apUserDao.queryByPhone(dto.getPhone());
        //校验用户是否存在
        if (apUser==null){
            return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST);
        }
        //校验密码
        String userPassword = dto.getPassword();
        String mysqlPassword = apUser.getPassword();
        userPassword = DigestUtils.md5DigestAsHex((userPassword + apUser.getSalt()).getBytes());
        if (!userPassword.equals(mysqlPassword)){
            return  ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
        }
        //封装对象返还token给前端
        HashMap<String, Object> map = new HashMap<>();
        apUser.setPassword("");
        apUser.setSalt("");
        String token = AppJwtUtil.getToken(apUser.getId());
        map.put("token",token);
        map.put("user",apUser);
        return ResponseResult.okResult(map);
    }
}
